home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / amigae.june.archive / 000149_crash!cs.weber.edu!leon_Mon, 28 Jun 93 21:45:57 PST.msg < prev    next >
Text File  |  1993-08-31  |  3KB  |  93 lines

  1. Received: by bkhouse.cts.com (V1.16/Amiga)
  2.     id AA00000; Mon, 28 Jun 93 21:45:57 PST
  3. Received: from cs.weber.edu by crash.cts.com with smtp
  4.     (Smail3.1.28.1 #15) id m0oAWym-0000tAC; Mon, 28 Jun 93 21:07 PDT
  5. Received: from icarus.weber.edu (icarus.cs.weber.edu) by cs.weber.edu (4.1/SMI-4.1.1)
  6.     id AA11664; Mon, 28 Jun 93 22:05:18 MDT
  7. Received: by icarus.weber.edu (5.0/SMI-SVR4)
  8.     id AA11684; Mon, 28 Jun 93 22:04:07 MDT
  9. Date: Mon, 28 Jun 93 22:04:07 MDT
  10. Message-Id: <9306290404.AA11684@icarus.weber.edu>
  11. Content-Length: 1884
  12. From: leon@cs.weber.edu (Leon D. Atkinson)
  13. To: amigae@bkhouse.cts.com
  14. Subject: OK, OK...
  15.  
  16.  
  17. The problem with my generator IS something stupid.  I assumed the section
  18. 4 was the only stuff on math... Anyway, all I should have to do is 
  19. change my *'s to Mul()'s.
  20.  
  21. The float support is apt to change, so I'm not going to bother to
  22. do a more precise check of the randomness than by whole numbers, but
  23. it's probably close enough.
  24.  
  25. One thing I couldn't find in the docs was how to create the equivalent of
  26. a header file in C, or a package in Ada.  So, I just put it at the top of
  27. the file for main().
  28.  
  29. Note, this function does tend to wander, meaning it takes a long time for
  30. it's output to converge toward the correct average, at least with the seed
  31. I was testing with.
  32.  
  33. Anyway, enough talking, here's the source (both C and E):
  34.  
  35. ***E source***
  36. /*Random number generator*/
  37. /*C is a constant in the form 2^n+1*/
  38. /*K is a positive prime number*/
  39. /*X is the upper limit*/
  40. /*I got this algorithm out of Game Playing with Computers*/
  41. /*by Donald D. Spencer*/
  42.  
  43. CONST C=32769, K=37, X=429496730
  44.  
  45. DEF rand_seed: LONG
  46.  
  47. PROC seedRandom(new_seed)
  48.      rand_seed := new_seed
  49. ENDPROC
  50.  
  51. PROC randomNum(range)
  52.      rand_seed := Mod((Mul(rand_seed, C) + K), X)
  53.  
  54.      RETURN Abs((Mod(rand_seed, range) + 1)) 
  55. ENDPROC
  56.  
  57.  
  58. /*Main procedure just for testing*/
  59. PROC main()
  60.      DEF counter
  61.      DEF total: LONG
  62.  
  63.      seedRandom(1212490)
  64.  
  65.      FOR counter := 1 TO 1000000
  66.           total := total + randomNum(100)
  67.      ENDFOR
  68.      WriteF('Average: \d\n',Div(total,1000000))
  69. ENDPROC
  70. /*this should spit out an average of 52, where the ideal should be 50*/
  71.  
  72.  
  73. ***C source***
  74. #define C 32769
  75. #define K 37
  76. #define X 429496730
  77.  
  78. unsigned int RND_seed;
  79.  
  80. void SEED(unsigned int new_seed) {
  81.      RND_seed = new_seed;
  82.      }
  83.  
  84. unsigned int RND(unsigned int range) {
  85.      RND_seed = (((C * RND_seed) + K) % X);
  86.      return(((RND_seed)%range)+1);
  87.      }
  88.  
  89. *************
  90.  
  91. OK, have at it, fellas.
  92.  
  93.                     -Leon